package utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 二倍均值法 拆分红包
 * redis 数据结构
 *      1、list 记录红包的拆分金额
 *      2、hash 用来记录抢红包的人数和金额
 */
public class RedPacketSplit {


    /**
     * 发红包 redis 数据结构  lpush  lpop 来解决
     */
    public static void sendRedPackageAlgorithm() {
        Integer[] algorithm = splitRedPackageAlgorithm(100, 5);
        /*
            1、随机生成UUID为key   redpackage:uuid
            2、将拆分出来的红包全部放入redis   leftPushAll(key,algorithm);
            3、给这个key设置过期时间 24小时 = 1天
         */
    }


    /**
     * 红包拆分方法  二倍均值法
     * @param totalMoney 总金额
     * @param redPackageNumber 需要拆分红包个数
     * @return 返回具体个数金额
     */
    public static Integer[] splitRedPackageAlgorithm(int totalMoney,int redPackageNumber) {
        Integer[] redPackageNumbers = new Integer[redPackageNumber];
        //已经被抢夺的红包金额，已经被拆分塞进子红包的金额
        int useMoney = 0;

        for (int i = 0; i < redPackageNumber; i++) {
            //如果是最后一个红包 那么将剩余的金额都给最后一个人
            if (i == redPackageNumber -1) {
                redPackageNumbers[i] =totalMoney - useMoney;
            } else {
                //二倍均值法 每次拆分后塞进子红包的金额 = 随机区间(0,(剩余红包金额M / 未被抢的剩余红包个数N) * 2)
                int avgMoney =((totalMoney - useMoney) / (redPackageNumber - i)) * 2;
                redPackageNumbers[i] = 1 + new Random().nextInt(avgMoney - 1);
            }
            useMoney = useMoney + redPackageNumbers[i];
        }
        return  redPackageNumbers;
    }


    /**
     * 抢红包
     * 根据每个用户的token 来判定是否已经抢过红包
     */
    public static void robRedPackageAlgorithm(String token) {

        /*
            1、根据当前token去redis获取hash结构类型是否已经抢过红包
            2、如果没有抢过，则从list数据结构类型中leftpop 出一个红包金额，如果红包金额不为null，则将当前token和金额存入redis的hash结构类型，记录
                2.1、后续异步进入mysql或者MQ 进一步做统计处理 每一年你发出多少红包，抢到了多少红包，年度总结
            3、如果已经抢过，则提示你已经抢过
            4、如果金额为空，则提示红包已经抢完了
         */
    }
    /**
     * 领取记录
     */
    public static void redPackageInfo() {
        /*
            hgetAll key 用来获取抢到过的全部人和红包金额
         */
    }


    public static void main(String[] args) {
        List list = new ArrayList();
        for (int i = 0; i < 40; i++) {
            list.add(i);
        }
        Integer[] redPackageArray = splitRedPackageAlgorithm(100,5);
        for (Integer element:redPackageArray) {
            System.out.print(element + ",");
        }
    }
}
